﻿#include <iostream>
#include <cstring>
using namespace std;

#define MAC_ADDRESS_LENGTH 6  // MAC 地址长度

// 定义 MAC_address 类型
typedef unsigned char MAC_address[MAC_ADDRESS_LENGTH];

// 以太网帧结构体
struct EthernetFrame {
    MAC_address destination;  // 目标地址
    MAC_address source;       // 源地址
    unsigned short type;       // 类型字段
    unsigned char data[1500];   // 数据字段
};

// 本机 MAC 地址
MAC_address this_mac_address = { 0x00, 0x50, 0x56, 0xC0, 0x00, 0x01 };

// 判断目标地址是否匹配
int mac_address_match(const EthernetFrame* frame) {
    // 判断是否是广播地址 (全 FF)
    bool is_broadcast = true;
    for (int i = 0; i < MAC_ADDRESS_LENGTH; i++) {
        if (frame->destination[i] != 0xFF) {
            is_broadcast = false;
            break;
        }
    }
    if (is_broadcast) return 1;  // 是广播地址，匹配

    // 判断是否是多播地址 (第一字节最低位为 1)
    if (frame->destination[0] & 0x01) return 1;  // 是多播地址，匹配

    // 判断是否是本机地址
    if (memcmp(frame->destination, this_mac_address, MAC_ADDRESS_LENGTH) == 0) {
        return 1;  // 是本机地址，匹配
    }

    // 不匹配
    return 0;
}

// 打印 MAC 地址
void print_mac_address(const MAC_address& mac) {
    for (int i = 0; i < MAC_ADDRESS_LENGTH; ++i) {
        if (i > 0) cout << ":";
        printf("%02X", mac[i]);
    }
}

int main() {
    EthernetFrame frame;
    // 设置目标地址为本机地址
    memcpy(frame.destination, this_mac_address, MAC_ADDRESS_LENGTH);

    cout << "帧目标地址：";
    print_mac_address(frame.destination);
    cout << endl;

    int result = mac_address_match(&frame);
    if (result) cout << "匹配：帧被接受。" << endl;
    else cout << "不匹配：帧被丢弃。" << endl;

    return 0;
}
